举个栗子
给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA)。
方便理解、比如对于下图:

Binary Search Tree 的LCA
在二叉搜索树中,利用BST属性,我们可以在O(h)时间找到LCA,其中h是树的高度。
1 | /* 查找n1和n2的公共祖先,该函数假定 n1、n2存在于Binary Search Tree上*/ |
普通二叉树的LCA
普通二叉树节点无特殊规律,无法按上述逻辑实现,对于普通二叉树NA、NB的公共祖先可分为以下三种情况(假定NA、NB存在于二叉树):
- 给定键NA或NB与root匹配,则root为LCA
- NA、NB 分别在root的两边,LCA为root
- NA、NB均位于左子树(或右子树),则LCA位于左子树(或右子树)
通过单次遍历二叉树查找LCA,时间复杂度为O(n)。
1 | pLCA_Node findLCA(pLCA_Node root , int mem1, int mem2){ |
上述实现是建立在NA、NB均存在于二叉树。如果NA、NB中某个值不存在于二叉树会将另一个值作为LCA返回(理想情况下应该返回NSNULL)。我们可以通过传递两个布尔变量v1、v2 来扩展这个这类情况,当树中存在n1时,v1置位true,当树中存在n2时,v2置为true。
完整实现
.h 文件
1 | #include <stdio.h> |
.m 文件
1 | #include "FindLCA.h" |
测试代码
1 |
|
执行结果
1 | LCA(4,5)---2 |
如果对你有帮助的话,Star✨下一吧!